Weboldal JAVA Spring Boot alapokon - 4

Az előző részben a Repository réteggel foglalkoztunk, ahol JPA segítségével lekérdezéseket készítettünk az adatbázis felé.

Ezúttal a Service rétegről beszélünk, amely az üzleti logika kialakításának színhelye. Azaz a Repository réteg felől megkapott adatokra itt tudunk kiépteni specifikus megoldásokat. Az itt feldolgozott adatokat adjuk aztán tovább a következő réteg, a Controller felé (illetve fordítva, a felhasználótól érkező adatokat adjuk a Repository irányába). Nézzük végig a konkét példát és menjünk végig az egyes osztályokon:

UserServiceImpl: túl sok pluszt nem teszünk hozzá az eddigiekhez. A @Service annotációval jelezzük, hogy Service réteget készítünk. A dependency injection alkalmazásával szimplán meghivatkozzuk a UserRepository-t, az @Autowired annotációval pedig magát az objektumot hozzuk létre. Majd meghívjuk annak két eljárását, a findByEmail-t és a findByFullName-t. Az onnan visszakapott értéket aztán továbbadjuk a Controller rétegnek. Más nem is történik itt jelen példában, megmarad szimpla közvetítő közegnek a rétegünk. Mi is a Dependency Injection? Egyszerűen megfogalmazva objektumokat tudunk ezzel átadni más objektumok számára. Az Inversion of Control megvalósításáról beszélünk, ami azt mondja ki, hogy újrafelhasználható egységeket létrehozva a kódban annyiszor használjuk fel ezeket az objektumokat, ahányszor szükség van rájuk (és nem többször, ami kimondottan előnyös hatékonysági szempontból).

StoryService: a dependency injection itt is felbukkan, azt következően pedig a StoryRepository eljárásai kerülnek meghívásra. Ami itt érdekes az a delete eljárás, amely a Story Repository-nak átadott story objektumot törli ki az adatbázisból. A save eljárás ezzel szemben egy új rekordot hoz létre a Story adattáblában. Ennek keretében meghívjuk a beépített date függvényt, amely az aktuális dátumot adja meg nekünk. A később tárgyalandó Security területhez tartozik a getAuthentication függvény meghívása, amellyel azt ellenőrizzük, hogy a User autentikálása megtörtént-e (lásd bővebben egy későbbi cikkben). A bejelentkezett felhasználót aztán megkeressük az adatbázisban a findByFullName eljárással, majd a visszakapott értéket átadjuk a setUser eljárással az adatbázisnak, mint a bejegyzés íróját.

UserDetailsImpl: ez már inkább a Security részhez tartozik, de azért bezéljünk kicsit róla itt is. Mi is történik itt? Az osztályban azt vizsgáljuk meg, hogy a felhasználó amikor bejelentkezik a felhasználói felületen (a HTML oldalon lévő form felületen) az adatbázisban megtalálható-e, és ha igen, milyen jogokkal rendelkezik. Ha a findByFullName-re kapunk vissza választ az adatbázisból, akkor egy HashSet-be (amely nagy vonalakban nem más mint egy tömb, amelyben nincsenek ismétlődő elemek) elmentjük a getRoles használatával a User-hez tartozó Role-okat (mivel egy Usernek több Role-ja lehet, ezért használunk tömböt). A visszakapott Role-okat aztán átadjuk a Spring beépített grantedAuthorities függvényének, amely a felhasználó hozzáférését biztosítja az egyes oldalakhoz, adatbázis táblákhoz. Erről bővebben majd sorozatunk befejező részében lesz szó.

Adatbázis kapcsolatok - Service réteg
Adatbázis kapcsolatok - Service réteg


A Service réteget ezzel át is vettük, megkaptuk tehát az adatokat a Repository réteg felől, amelyet most csak simán továbbadunk a Controller réteg felé, külön üzleti logikát nem építettünk rá. Másik oldalról megvizsgáltuk, hogy a bejelentkezett felhasználónak milyen jogai vannak, és attól függően adjuk vissza a Repository felé a Controller felől érkező adatokat. A következő részben megyünk tovább a Controller réteg felé.